Traveling by Stagecoach POJ 2686,题解。
作为一名菜鸟,说状压DP,还是有点勉强,顶多做个学习笔记。
首先,什么是DP,状态转移,其实就是从已经确定的状态,到一个状态。
状压DP,我理解的就是 用 一个数的二进制表达状态。 1,表示 有 ,0 表示无
比如 4而进制表示 100 , 说明 3号 位置表示 有 ,其它的都表示没有。
题目 Traveling by Stagecoach POJ 2686
开一个DP【S】[M]. S 是票的使用状况 , M,是在哪一个城市。值就是最小花费。
把一个票都没有用的,起点 标记为0,也就是 DP[1<<n-1][a]==0.
暴力枚举 所有 可以用的票 ,(S>>i)&1 表示第 I 张票可不可以用。
再暴力枚举 当前这个S下所有的 可以到的城市,dp[S][v]!=INF,当前S下v这个城市可不可以到达。
然后再暴力所有 v, 这个城市所有的路,然后使用第 i张票。d[v][u]>=0。V 和u中间的路。
然如果用这张票,走这条路 到目的地的值小就覆盖前面的值S&~(1<<i)使用第i张票后的状态,d[v][u],从 v城市到u城市的路。
dp[S&~(1<<i)][u]=min(dp[S&~(1<<i)][u],dp[S][v]+(double)d[v][u]*1.0/t[i])。
AC代码:
1 | #include<iostream> |